package com.ethink.id.generator;

import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.time.Duration;

import static com.ethink.id.generator.constant.IdGeneratorRedisConstant.ID_GENERATOR_PREFIX;

@Component
public class IdGenerator {

    @Autowired
    private StringRedisTemplate redisTemplate;

    /**
     * 销售需求单单号
     *
     * @return
     */
    public String xq() {
        return generate("XQ", 6);
    }

    /**
     * 销售需求单详号
     *
     * @return
     */
    public String xqDetail() {
        return generate("XQXD", 6);
    }


    /**
     * 采购单号
     *
     * @return
     */
    public String cg() {
        return generate("CG", 6);
    }

    /**
     * 采购单详单号
     *
     * @return
     */
    public String cgDetail() {
        return generate("CGXD", 6);
    }

    /**
     * 物流跟进单
     *
     * @return
     */
    public String ts() {
        return generate("TS", 6);
    }

    /**
     * 物流跟进单申请表
     *
     * @return
     */
    public String tsap() {
        return generate("TSAP", 6);
    }

    /**
     * 物流跟进详单-入库
     *
     * @return
     */
    public String rk() {
        return generate("RK", 6);
    }


    /**
     * 物流跟进详单-出库
     *
     * @return
     */
    public String ck() {
        return generate("CK", 6);
    }

    /**
     * 物流调拨单
     *
     * @return
     */
    public String db() {
        return generate("DB", 6);
    }

    /**
     * 物流跟进详单
     *
     * @return
     */
    public String dbDetail() {
        return generate("DBXD", 6);
    }


    /**
     * 采购批次
     *
     * @return
     */
    public String pc() {
        return generate("PC", 6);
    }

    /**
     * tob预售单
     *
     * @return
     */
    public String tob() {
        return generate("TOB", 6);
    }

    /**
     * tob预售单详单
     *
     * @return
     */
    public String tobDetail() {
        return generate("TOBXD", 6);
    }

    /**
     * toc
     *
     * @return
     */
    public String toc() {
        return generate("TOC", 6);
    }

    /**
     * toc详单
     *
     * @return
     */
    public String tocDetail() {
        return generate("TOCXD", 6);
    }

    /**
     * 销售单
     *
     * @return
     */
    public String xs() {
        return generate("XS", 6);
    }

    /**
     * 销售单详单
     *
     * @return
     */
    public String xsetail() {
        return generate("XSXD", 6);
    }


    /**
     * 矫正
     * @return
     */
    public String jz() {
        return generate("JZ", 6);
    }

    /**
     * 矫正详单
     *
     * @return
     */
    public String jzetail() {
        return generate("JZXD", 6);
    }


    /**
     * 采购退单
     *
     * @return
     */
    public String cgtd() {
        return generate("CGTD", 6);
    }


    /**
     * 采购退单详情单号
     *
     * @return
     */
    public String cgtdxd() {
        return generate("CGTDXD", 6);
    }

    /**
     * 库存拆卸
     * @return
     */
    public String chai() {
        return generate("CHAI", 6);
    }


    /**
     * tob预售单退单
     *
     * @return
     */
    public String tobtd() {
        return generate("TOBTD", 6);
    }


    /**
     * tob预售单详单
     *
     * @return
     */
    public String tobtdxd() {
        return generate("TOBTDXD", 6);
    }


    /**
     * 销售单
     *
     * @return
     */
    public String xstd() {
        return generate("XSTD", 6);
    }

    /**
     * 销售单详单
     *
     * @return
     */
    public String xstdxd() {
        return generate("XSTDXD", 6);
    }

    /**
     * 货权变更
     *
     * @return
     */
    public String hqbg() {
        return generate("HQBG", 6);
    }

    /**
     * 库存状态变更
     *
     * @return
     */
    public String kcztbg() {
        return generate("KCZTBG", 6);
    }

    /**
     * 售后入库表
     *
     * @return
     */
    public String sh() {
        return generate("SH", 6);
    }

    /**
     * 其他出库
     *
     * @return
     */
    public String ock() {
        return generate("OCK", 6);
    }


    /**
     * 其他入库
     *
     * @return
     */
    public String ork() {
        return generate("ORK", 6);
    }


    private String generate(String prefix, int length) {
        // 2位年份+2位月份+2位日期+4位流水号（0001——9999）
        DateTime now = new DateTime();
        String date = DateUtil.format(now, DatePattern.PURE_DATE_PATTERN).substring(2);
        StringBuilder orderPrefix = new StringBuilder();
        orderPrefix.append(prefix).append(date);
        long serializeId = getSerializeId(orderPrefix.toString());
        orderPrefix.append(String.format("%0" + length + "d", serializeId));
        return orderPrefix.toString();
    }

    private long getSerializeId(String key) {
        long id = redisTemplate.opsForValue().increment(ID_GENERATOR_PREFIX + key);
        redisTemplate.expire(ID_GENERATOR_PREFIX + key, Duration.ofHours(25));
        return id;
    }
}
